from django.shortcuts import render, redirect
from django.http.response import JsonResponse
from django.urls.base import reverse_lazy, reverse
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods, require_POST, require_GET
from .models import BlogCategory, Blog, BlogComment
from .forms import PubBlogForm
from django.db.models import Q


# Create your views here.
def index_blog(request):
    blogs = Blog.objects.all()
    return render(request, "myblog/index.html", context={"blogs": blogs, "q": ""})


def detail_blog(request, blog_id):
    try:
        blog = Blog.objects.get(pk=blog_id)
    except Exception as e:
        blog = None
    return render(request, "myblog/detail.html", context={"blog": blog})


# @login_required(login_url='/myauth/login')
# @login_required(login_url=reverse_lazy('myauth:login'))
@login_required()
@require_http_methods(["GET", "POST"])
def pub_blog(request):
    if request.method == "GET":
        categories = BlogCategory.objects.all()
        return render(
            request, "myblog/pub_blog.html", context={"categories": categories}
        )
    else:
        form = PubBlogForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data.get("title")
            category_id = form.cleaned_data.get("category")
            content = form.cleaned_data.get("content")
            blog = Blog.objects.create(
                title=title,
                content=content,
                category_id=category_id,
                author=request.user,
            )
            return JsonResponse(
                {"code": 200, "message": "博客发布成功", "data": {"blog_id": blog.id}}
            )
        else:
            print(form.errors)
            return JsonResponse(
                {
                    "code": 400,
                    "message": "标题不能为空，且标题不超过50个字符,内容不超过5000个字符",
                }
            )


@require_POST
@login_required()
def pub_comment(request):
    blog_id = request.POST.get("blog_id")
    content = request.POST.get("content")
    BlogComment.objects.create(content=content, blog_id=blog_id, author=request.user)
    # 重新加载博客详情页
    return redirect(reverse("myblog:detail_blog", kwargs={"blog_id": blog_id}))


@require_GET
def search(request):
    # /search?q=xxx
    q = request.GET.get("q")
    # 查找标题或内容中含有q的关键字博客,查找不区分大小写
    # blogs = Blog.objects.filter(Q(title__icontains=q) | Q(content__icontains=q)).all()
    blogs = Blog.objects.filter(Q(title__icontains=q)).all()
    return render(request, "myblog/index.html", context={"blogs": blogs, "q": q})


@require_POST
@login_required()
def delete_blog(request):
    blog_id = request.POST.get("blog_id")
    blog = Blog.objects.filter(id=blog_id)
    blog.delete()
    return JsonResponse({"code": 200, "message": "博客删除成功"})
